﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CoreData;
using EntityData;
using Helper;
namespace Services
{

    public partial class Student_FeeService
    {
       readonly IStudent_FeeEntity entity;
       readonly Class_FeeTimeService CourseFeeTimeService;
       readonly Receipt_VoucherFeeService ReceiptVoucherFeeService;
       readonly Student_FeeTimeService StudentFeeTimeService;
       public Student_FeeService()
       {
           this.entity = new Student_FeeEntity();
           this.CourseFeeTimeService = new Class_FeeTimeService();
           this.ReceiptVoucherFeeService = new Receipt_VoucherFeeService();
           this.StudentFeeTimeService = new Student_FeeTimeService();

       }

       #region Main Method

       /// <summary>
       /// Save 
       /// </summary>
       /// <param name="_model"></param>
       /// <returns></returns>
       public long Save(object _model)
       {
           try
           {
               var id = long.Parse(_model.GetType().GetProperty("ID").GetValue(_model, null).ToString());
               if (id == 0)
               {
                   return entity.Save((CoreData.Student_Fee)_model, Table.Student_Fee.ToString());
               }
               else
               {
                   return entity.Update((CoreData.Student_Fee)_model, Table.Student_Fee.ToString());
               }
           }
           catch { return -1; }
       }

       /// <summary>
       /// Get by ID
       /// </summary>
       /// <param name="_id"></param>
       /// <returns></returns>
       public CoreData.Student_Fee GetByID(long _id)
       {
           try
           {
               return entity.GetByCusTomSQL(String.Format(SQLCommand.GetStudentFee, "Student_Fee.ID=" + _id)).First();
           }
           catch { return null; }
       }

       /// <summary>
       /// Get List
       /// </summary>
       /// <returns></returns>
       public IList<CoreData.Student_Fee> GetList()
       {
           try
           {
               return entity.GetByCusTomSQL(String.Format(SQLCommand.GetStudentFee, "1=1")).ToList();
           }
           catch { return null; }

       }

       /// <summary>
       /// Get List with Linq
       /// </summary>
       /// <returns></returns>
       public IList<CoreData.Student_Fee> GetListByLINQ(Func<CoreData.Student_Fee, Boolean> _where)
       {
           try
           {
               return entity.GetMany(_where, Table.Student_Fee.ToString()).ToList();
           }
           catch { return null; }
       }
       /// <summary>
       /// Get One with Linq
       /// </summary>
       /// <returns></returns>
       public CoreData.Student_Fee GetOneByLINQ(Func<CoreData.Student_Fee, Boolean> _where)
       {
           try
           {
               return entity.Get(_where, Table.Student_Fee.ToString());
           }
           catch { return null; }
       }

       /// <summary>
       /// Get List with search string
       /// </summary>
       /// <returns></returns>
       public IList<CoreData.Student_Fee> GetList(string _searchstring)
       {
           //search theo tieu chi nao do         
           try
           {
               var data = entity.GetByCusTomSQL(String.Format(SQLCommand.GetStudentFee, _searchstring)).ToList();
               SortStudentByPayFeeStatus(data);
               return data.OrderByDescending(c => c.Order).ToList();
           }
           catch { return null; }
       }


       /// <summary>
       /// Delete
       /// </summary>
       /// <param name="_model"></param>
       /// <returns></returns>
       public bool Delete(object _model)
       {
           try
           {
               entity.Delete((CoreData.Student_Fee)_model, Table.Student_Fee.ToString());
               return true;
           }
           catch { return false; }
       }


       #endregion



        #region Other Method

        /// <summary>
        /// Sắp xếp học viên hiển thị theo tình trạng đóng học phí
        /// </summary>
        /// <param name="student"></param>
       void SortStudentByPayFeeStatus(IList<Student_Fee> student)
       {
           
           //lay ngay he thong
           var CurrentDate = DateTime.Now;
           for (int i = student.Count-1; i >=0;i-- )
           {
               var feetime = StudentFeeTimeService.GetStudentFeeTimeByStudentIDAndTypeReturnDatatable(student[i].StudentID, student[i].TypeExt);
               var Vouchers = ReceiptVoucherFeeService.GetByStudentID(student[i].StudentID);
               DateTime StartDate1, StartDate2, StartDate3, StartDate4, StartDate5, StartDate6;
               StartDate1 = DateTime.MinValue; StartDate2 = DateTime.MinValue; StartDate3 = DateTime.MinValue;
               StartDate4 = DateTime.MinValue; StartDate5 = DateTime.MinValue; StartDate6 = DateTime.MinValue;
              
               DateTime EndDate1, EndDate2, EndDate3, EndDate4, EndDate5, EndDate6;

               EndDate1 = DateTime.MinValue; EndDate2 = DateTime.MinValue; EndDate3 = DateTime.MinValue;
               EndDate4 = DateTime.MinValue; EndDate5 = DateTime.MinValue; EndDate6 = DateTime.MinValue;
               
               if (feetime.Rows[0]["StartDate1"] != DBNull.Value)                 
                   StartDate1 = DateTime.Parse(feetime.Rows[0]["StartDate1"].ToString());
               if (feetime.Rows[0]["StartDate2"] != DBNull.Value)
                   StartDate2 = (DateTime)feetime.Rows[0]["StartDate2"];
               if (feetime.Rows[0]["StartDate3"] != DBNull.Value)
                   StartDate3 = DateTime.Parse(feetime.Rows[0]["StartDate3"].ToString());
               if (feetime.Rows[0]["StartDate4"] != DBNull.Value)
                   StartDate4 = DateTime.Parse(feetime.Rows[0]["StartDate4"].ToString());
               if (feetime.Rows[0]["StartDate5"] != DBNull.Value)
                   StartDate5 = DateTime.Parse(feetime.Rows[0]["StartDate5"].ToString());
               if (feetime.Rows[0]["StartDate6"] != DBNull.Value)
                   StartDate6 = DateTime.Parse(feetime.Rows[0]["StartDate6"].ToString());
               if (feetime.Rows[0]["EndDate1"] != DBNull.Value)
                   EndDate1 = DateTime.Parse(feetime.Rows[0]["EndDate1"].ToString());
               if (feetime.Rows[0]["EndDate2"] != DBNull.Value)
                   EndDate2 = DateTime.Parse(feetime.Rows[0]["EndDate2"].ToString());
               if (feetime.Rows[0]["EndDate3"] != DBNull.Value)
                   EndDate3 = DateTime.Parse(feetime.Rows[0]["EndDate3"].ToString());
               if (feetime.Rows[0]["EndDate4"] != DBNull.Value)
                   EndDate4 = DateTime.Parse(feetime.Rows[0]["EndDate4"].ToString());
               if (feetime.Rows[0]["EndDate5"] != DBNull.Value)
                   EndDate5 = DateTime.Parse(feetime.Rows[0]["EndDate5"].ToString());
               if (feetime.Rows[0]["EndDate6"] != DBNull.Value)
                   EndDate6 = DateTime.Parse(feetime.Rows[0]["EndDate6"].ToString());
              

               if (student[i].TypeExt == 1)//dong 1 lan
               {
                   long sum = 0;//tong tien da dong
                   foreach (var voucher in Vouchers)
                   {
                       sum += voucher.Money;
                   }
                   if (CurrentDate >= StartDate1 && CurrentDate <= EndDate1)
                   {
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate1 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3;
                           }
                       }
                       else if (sum < student[i].FeeToPayExt)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                   }
                   else if (CurrentDate > EndDate1)
                   {
                       if (sum < student[i].FeeToPayExt)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                   }
                   student[i].StartPayDateExt = StartDate1;
               }

               if (student[i].TypeExt == 2)//dong 2 lan
               {
                   long sum = 0;//tong tien da dong
                   var sotienphaidong = student[i].FeeToPayExt / 2;

                   if (CurrentDate >=StartDate1 && CurrentDate <= EndDate1)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 1")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate1 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt =StartDate1;
                   }
                   else if (CurrentDate > EndDate1 && CurrentDate <StartDate2)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 1")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate1;
                   }
                   else if (CurrentDate >= StartDate2 && CurrentDate <= EndDate2)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 2")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate2 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }

                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate2;
                   }
                   else if (CurrentDate >EndDate2)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 2")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate2;
                   }

               }


               if (student[i].TypeExt == 4)//dong 4 lan
               {
                   long sum = 0;//tong tien da dong
                   var sotienphaidong = student[i].FeeToPayExt / 4;

                   if (CurrentDate >= StartDate1 && CurrentDate <= EndDate1)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 1")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate1 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate1;
                   }
                   else if (CurrentDate > EndDate1 && CurrentDate < StartDate2)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 1")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate1;
                   }
                   else if (CurrentDate >= StartDate2 && CurrentDate <= EndDate2)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 2")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate2 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate2;
                   }
                   else if (CurrentDate > EndDate2 && CurrentDate < StartDate3)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 2")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate2;
                   }
                   else if (CurrentDate >= StartDate3 && CurrentDate <= EndDate3)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 3")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate3 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate3;
                   }
                   else if (CurrentDate > EndDate3 && CurrentDate < StartDate4)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 3")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate3;
                   }
                   else if (CurrentDate >= StartDate4 && CurrentDate <= EndDate4)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 4")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate4 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate4;
                   }
                   else if (CurrentDate > EndDate4)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 4")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate4;
                   }

               }


               if (student[i].TypeExt == 6)//dong 6 lan
               {
                   long sum = 0;//tong tien da dong
                   var sotienphaidong = student[i].FeeToPayExt / 6;

                   if (CurrentDate >= StartDate1 && CurrentDate <= EndDate1)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 1")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate1 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate1;
                   }
                   else if (CurrentDate > EndDate1 && CurrentDate < StartDate2)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 1")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate1;
                   }
                   else if (CurrentDate >= StartDate2 && CurrentDate <= EndDate2)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 2")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate2 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt =StartDate2;
                   }
                   else if (CurrentDate > EndDate2 && CurrentDate < StartDate3)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 2")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt =StartDate2;
                   }
                   else if (CurrentDate >= StartDate3 && CurrentDate <= EndDate3)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 3")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate3 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate3;
                   }
                   else if (CurrentDate > EndDate3 && CurrentDate < StartDate4)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 3")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate3;
                   }
                   else if (CurrentDate >= StartDate4 && CurrentDate <= EndDate4)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 4")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate4 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate4;
                   }
                   else if (CurrentDate > EndDate4 && CurrentDate < StartDate5)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 4")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate4;
                   }
                   else if (CurrentDate >= StartDate5 && CurrentDate <= EndDate5)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 5")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate5 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate5;
                   }
                   else if (CurrentDate > EndDate5 && CurrentDate < StartDate6)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 5")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate5;
                   }
                   else if (CurrentDate >= StartDate6 && CurrentDate <= EndDate6)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 6")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum == 0) // chua có đóng một đồng nào cả
                       {
                           if ((StartDate6 - CurrentDate).TotalDays <= 7) // sap toi han trong 7 ngay thi mới hiện trạng thái chưa đóng
                           {
                               student[i].Order = 3; // chưa đóng
                           }
                       }
                       else if (sum < sotienphaidong)
                       {
                           student[i].Order = 2;// đóng thiếu
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate6;
                   }
                   else if (CurrentDate > EndDate6)
                   {
                       foreach (var voucher in Vouchers.Where(c => c.TimeFee.Contains("Lần 6")))
                       {
                           sum += voucher.Money;
                       }
                       if (sum < sotienphaidong)
                       {
                           student[i].Order = 1;// quá hạn mà chưa đóng đủ 
                       }
                       sum = 0;
                       student[i].StartPayDateExt = StartDate6;
                   }

               }
           }
       }

       public Student_Fee GetByStudentID(long StudentID)
       {
           try
           {
               return entity.GetByCusTomSQL(String.Format(SQLCommand.GetStudentFee, " Student_Fee.StudentID ="+StudentID)).ToList()[0];
           }
           catch
           {
               return null;
           }
       }
       public IList<Student_Fee> GetForReportData(string Search)
       {
           try {
               return entity.GetByCusTomSQL(String.Format(SQLCommand.GetStudentFeeForReport, Search)).ToList();
           }
           catch {
               return null;
           }
       }

       public IList<Student_Fee> GetStudentPayFeeForReportData(string Search)
       {
           try
           {
               return entity.GetByCusTomSQL(String.Format(SQLCommand.GetStudentPayFeeForReport, Search)).ToList();
           }
           catch
           {
               return null;
           }
       }


        #endregion 
    
    }
         
}
